package com.offroader.push;

import android.app.Application;
import android.app.Notification;
import android.content.Context;
import android.support.v4.app.NotificationCompat;
import android.widget.RemoteViews;

import com.offroader.R;
import com.offroader.task.EasyTask;
import com.offroader.utils.JsonUtils;
import com.offroader.utils.LogUtils;
import com.offroader.utils.NetUtils;
import com.offroader.utils.NetUtils.NetType;
import com.offroader.utils.StringUtils;
import com.umeng.message.PushAgent;
import com.umeng.message.UmengMessageHandler;
import com.umeng.message.UmengNotificationClickHandler;
import com.umeng.message.entity.UMessage;

/**
 * 友盟消息推送组件
 * 
 * @author li.li
 *
 */
public class UmengPush {
	private static final String DEF_ALIAS_TYPE = "READNOVEL";//默认账户类型
	private static final UmengPush instance = new UmengPush();
	private PushAgent mPushAgent;
	private Application app;

	private UmengPush() {
	}

	public static UmengPush getInstance() {
		return instance;
	}

	/**
	 * 初始化友盟云推送
	 */
	public void init(final Application app, final IUmentPushGetAction pushGetAction) {
		this.app = app;

		//实例化友盟推送服务
		mPushAgent = PushAgent.getInstance(app);
		mPushAgent.setDebugMode(false);

		/**
		 * 自定义消息处理
		 * (代码需在 Application 的onCreate() 中调用使用)
		 * 
		 * 该Handler是在IntentService中被调用，故
		 * 1. 如果需启动Activity，需添加Intent.FLAG_ACTIVITY_NEW_TASK
		 * 2. IntentService里的onHandleIntent方法是并不处于主线程中，因此，如果需调用到主线程，需如下所示;
		 * 	      或者可以直接启动Service
		 * */
		UmengMessageHandler messageHandler = new UmengMessageHandler() {

			//处理自定义消息(可以非push方式展示)
			@Override
			public void dealWithCustomMessage(final Context context, final UMessage msg) {
				//				new Handler(app.getMainLooper()).post(new Runnable() {
				//
				//					@Override
				//					public void run() {
				//						//						UTrack.getInstance(app.getApplicationContext()).trackMsgClick(msg);
				//						//						Toast.makeText(context, msg.custom, Toast.LENGTH_LONG).show();
				//
				//					}
				//				});
			}

			//自定义通知栏样式
			@Override
			public Notification getNotification(Context context, UMessage msg) {
				switch (msg.builder_id) {
				case 1:
					NotificationCompat.Builder builder = new NotificationCompat.Builder(context);
					RemoteViews myNotificationView = new RemoteViews(context.getPackageName(), R.layout.umeng_push_notification_view);
					myNotificationView.setTextViewText(R.id.notification_title, msg.title);
					myNotificationView.setTextViewText(R.id.notification_text, msg.text);
					myNotificationView.setImageViewBitmap(R.id.notification_large_icon, getLargeIcon(context, msg));
					myNotificationView.setImageViewResource(R.id.notification_small_icon, getSmallIconId(context, msg));
					builder.setContent(myNotificationView);
					Notification mNotification = builder.build();
					//由于Android v4包的bug，在2.3及以下系统，Builder创建出来的Notification，并没有设置RemoteView，故需要添加此代码
					mNotification.contentView = myNotificationView;
					return mNotification;
				default:
					//默认为0，若填写的builder_id并不存在，也使用默认。
					return super.getNotification(context, msg);
				}
			}
		};

		/**
		 * 自定义行为
		 * (负责处理消息的点击事件)
		 * 
		 * 该Handler是在BroadcastReceiver中被调用，故
		 * 如果需启动Activity，需添加Intent.FLAG_ACTIVITY_NEW_TASK
		 * */
		UmengNotificationClickHandler notificationClickHandler = new UmengNotificationClickHandler() {
			@Override
			public void dealWithCustomAction(Context context, UMessage msg) {
				//				ViewUtils.toastDialog(context, msg.custom, Toast.LENGTH_LONG);
				//{action_type:6,book_id:166969}
				if (!StringUtils.isEmpty(msg.custom)) {
					UmentPushActionBean customAction = JsonUtils.fromJson(msg.custom, UmentPushActionBean.class);

					for (IUmentPushAction actionEnum : pushGetAction.all()) {

						if (actionEnum.accept(customAction.getActionType())) {
							actionEnum.deal(context, customAction);//自定义行为处理
							break;
						}

					}
				}
			}
		};

		mPushAgent.setMessageHandler(messageHandler);
		mPushAgent.setNotificationClickHandler(notificationClickHandler);

	}

	/**
	 * 开启友盟推送服务
	 */
	public void enable() {
		if (!mPushAgent.isEnabled()) {
			mPushAgent.enable();
		}

	}

	/**
	 * 关闭友盟推送服务
	 */
	public void disable() {
		if (mPushAgent.isEnabled())
			mPushAgent.disable();
	}

	public void addUserId(final String userId) {
		if (StringUtils.isEmpty(userId))
			return;

		EasyTask.getWorkers().execute(new Runnable() {

			@Override
			public void run() {
				try {

					if (!NetType.TYPE_NONE.equals(NetUtils.checkNet())) {

						mPushAgent.removeAlias(String.valueOf(userId), DEF_ALIAS_TYPE);
						mPushAgent.addAlias(String.valueOf(userId), DEF_ALIAS_TYPE);

					}

				} catch (Throwable e) {
					LogUtils.error(e.getMessage(), e);
				}
			}
		});

	}

	public void removeUserId(final String userId) {
		if (StringUtils.isEmpty(userId))
			return;

		EasyTask.getWorkers().execute(new Runnable() {

			@Override
			public void run() {
				try {

					if (!NetType.TYPE_NONE.equals(NetUtils.checkNet())) {

						mPushAgent.removeAlias(userId, DEF_ALIAS_TYPE);
						mPushAgent.addAlias(userId, DEF_ALIAS_TYPE);

					}

				} catch (Throwable e) {
					LogUtils.error(e.getMessage(), e);
				}
			}
		});

	}

}
